다중 계절성 (Multiple Seasonality)
1. 개요
다중 계절성(Multiple Seasonality)이란 하나의 시계열 데이터 내에 서로 다른 주기를 가진 두 개 이상의 계절적 패턴이 동시에 존재하는 현상을 의미한다. 이러한 다중 계절성을 정확히 식별하고 모델링하는 것은 복잡한 시계열 데이터에서 노이즈를 제거하고 정확한 수요 예측과 자원 최적화를 달성하기 위해 필수적이다.
일반적인 단일 계절성(Single Seasonality)이 하나의 고정된 주기(예: 매년 1월의 매출 상승)만을 갖는 것과 달리, 다중 계절성은 여러 시간 척도(Time Scale)에서 반복되는 패턴이 중첩되어 나타난다. 대표적인 사례로 전력 수요량 데이터를 들 수 있다. 전력 수요는 하루 단위의 패턴(일간: 낮 시간대 상승, 밤 시간대 하락), 일주일 단위의 패턴(주간: 평일과 주말의 차이), 그리고 1년 단위의 패턴(연간: 여름철 냉방 및 겨울철 난방 수요 증가)이 동시에 작용하여 복합적인 파형을 형성한다.
2. 수학적 정의 및 원리
시계열 분해(Time Series Decomposition) 관점에서 다중 계절성은 관측값 $Y_t$를 추세(Trend), 여러 개의 계절성 성분(Seasonal components), 그리고 잔차(Remainder/Error)의 합 또는 곱으로 표현하는 것이다.
2.1 가법 모델 (Additive Model)
각 성분이 독립적으로 더해지는 구조이며, 계절성의 진폭이 시간에 따라 일정할 때 사용한다.
$$Y_t = T_t + S_{1,t} + S_{2,t} + \dots + S_{n,t} + \epsilon_t$$
- $T_t$: 추세 성분 (Trend)
- $S_{i,t}$: $i$번째 주기(예: 일간, 주간)의 계절성 성분
- $\epsilon_t$: 불규칙 변동분 (Residual)
2.2 승법 모델 (Multiplicative Model)
계절성의 진폭이 추세의 크기에 비례하여 변할 때 사용하며, 각 성분을 곱하는 구조이다.
$$Y_t = T_t \times S_{1,t} \times S_{2,t} \times \dots \times S_{n,t} \times \epsilon_t$$
이 모델에서 각 계절성 성분 $S_{i,t}$는 1을 기준으로 한 비율(Ratio)로 표현된다. 예를 들어, 특정 시점의 계절성 지수가 1.2라면 해당 시점의 값이 추세보다 20% 높음을 의미한다.
2.3 단일 계절성 vs 다중 계절성 비교
| 구분 |
단일 계절성 (Single Seasonality) |
다중 계절성 (Multiple Seasonality) |
| 주기 수 |
단일 주기 ($s$) |
다수 주기 ($s_1, s_2, \dots, s_n$) |
| 복잡도 |
상대적으로 낮음, 분석 용이 |
높음, 성분 간 간섭 발생 가능 |
| 대표 사례 |
월별 아이스크림 판매량 (연간 주기) |
서버 트래픽 (일간 $\times$ 주간 $\times$ 연간) |
| 분석 도구 |
단순 Seasonal Decomposition, SARIMA |
TBATS, Prophet, Dynamic Harmonic Regression |
3. 주요 분석 및 모델링 기법
다중 계절성을 처리하기 위해서는 단순한 차분(Differencing)보다는 주기를 유연하게 처리할 수 있는 고급 모델이 필요하다.
3.1 핵심 모델 설명
- TBATS: Exponential Smoothing의 확장판으로, T(Trigonometric seasonal components), B(Box-Cox transformation), A(ARMA errors), T(Trend), S(Seasonal components)의 약자이다. 삼각함수를 이용하여 비정수 주기(Non-integer period)까지 처리할 수 있는 강력한 모델이다.
- Prophet: Meta(Facebook)에서 개발한 모델로, 시계열을 일반화 가법 모델(GAM)로 접근한다. 푸리에 급수(Fourier Series)를 사용하여 다중 계절성을 모델링하며, 휴일 효과나 결측치 처리에 강점이 있다.
- 푸리에 급수 수식: 특정 주기 $P$를 가진 계절성 성분 $S_t$는 다음과 같이 근사된다.
$$S_t = \sum_{n=1}^{N} \left( a_n \cos\left(\frac{2\pi nt}{P}\right) + b_n \sin\left(\frac{2\pi nt}{P}\right) \right)$$
여기서 $N$은 푸리에 차수(Fourier order)로, 값이 클수록 더 복잡한 패턴을 학습할 수 있다.
- Dynamic Harmonic Regression (DHR): 상태 공간 모델(State Space Model)의 일종으로, 계절성을 사인(Sine)과 코사인(Cosine) 함수의 조합으로 표현하여 시간에 따라 계절성 패턴이 변하는 경우에도 대응 가능하다.
3.2 모델별 장단점 비교
| 모델 |
장점 |
단점 |
적합한 데이터 |
| TBATS |
복잡한 다중 주기 자동 탐색 및 처리 가능 |
계산 복잡도가 매우 높고 학습 속도가 느림 |
정밀한 통계적 추정이 필요한 데이터 |
| Prophet |
직관적인 파라미터 설정, 빠른 속도, 이상치에 강함 |
통계적 엄밀함이 부족하며 과적합 위험이 있음 |
비즈니스 지표, 도메인 지식이 반영된 데이터 |
| DHR |
계절성 변화를 동적으로 추적 가능 |
초기 파라미터 설정 및 모델 설계가 까다로움 |
주기성이 뚜렷하고 변동성이 큰 데이터 |
4. 구현 및 적용 방법
4.1 주기 탐색을 위한 FFT 분석
모델링 전, 데이터에 어떤 주기가 숨어있는지 확인하기 위해 고속 푸리에 변환(Fast Fourier Transform, FFT)을 사용한다. FFT는 시간 영역의 데이터를 주파수 영역으로 변환하여, 어떤 주파수(Frequency)에서 강한 에너지가 나타나는지 분석하는 기법이다.
- 분석 과정: $\text{Time Domain} \xrightarrow{FFT} \text{Frequency Domain} \rightarrow \text{Peak Detection} \rightarrow \text{Period Calculation}$
- 주기 계산: $\text{Period} = 1 / \text{Frequency}$
- 시각화 예시: FFT 결과 그래프(Periodogram)에서 X축은 주파수, Y축은 진폭(Amplitude)으로 나타난다. 특정 주파수 지점에서 뾰족하게 솟은 피크(Peak)가 발견되면, 해당 주파수의 역수가 데이터의 주요 주기임을 의미한다. (예: 주파수 $f=0.1428$에서 피크 발생 $\rightarrow 1/0.1428 \approx 7$일 주기)
4.2 단계별 적용 프로세스
- 데이터 전처리: 결측치 처리, 이상치 제거 및 로그 변환(승법 모델인 경우)을 수행한다.
- 주기 탐색: FFT 또는 Periodogram을 통해 주요 주기($s_1, s_2, \dots$)를 식별한다.
- 모델링: 식별된 주기를 기반으로 Prophet의
add_seasonality 또는 TBATS 모델을 적용한다.
- 검증: AIC/BIC 지표 또는 RMSE, MAPE 등의 오차 지표를 통해 모델 성능을 평가한다.
- 잔차 분석: 모델링 후 남은 잔차($\epsilon_t$)에 여전히 주기성이 남아있는지 확인하여, 필요시 추가 주기를 설정하거나 모델을 튜닝한다.
4.3 Python 구현 예시 (Prophet 활용)
from prophet import Prophet
import pandas as pd
# 1. 데이터 준비 (ds: 날짜, y: 값)
df = pd.read_csv('power_demand.csv')
# 2. 모델 초기화 및 기본 계절성 설정
model = Prophet(yearly_seasonality=True, weekly_seasonality=True, daily_seasonality=True)
# 3. 사용자 정의 다중 계절성 추가 (예: 4주 주기 - 28일)
model.add_seasonality(name='monthly', period=28, fourier_order=5)
# 4. 모델 학습
model.fit(df)
# 5. 미래 예측
future = model.make_future_dataframe(periods=365)
forecast = model.predict(future)
# 6. 결과 시각화
model.plot_components(forecast)
4.4 적용 사례 분석 결과 (가상 그래프 묘사)
전력 수요 데이터에 다중 계절성 모델을 적용했을 때, plot_components 결과는 다음과 같이 분리되어 나타난다.
- Trend: (우상향 곡선) 전반적인 전력 사용량의 점진적 증가 추세.
- Yearly: (사인파 형태) 7~8월(여름)과 12~1월(겨울)에 정점을 찍는 연간 반복 패턴.
- Weekly: (계단식 패턴) 월~금요일에 높게 유지되다가 토/일요일에 급격히 하락하는 주간 패턴.
- Daily: (매일 반복 파형) 오전 9시부터 오후 6시까지 상승했다가 밤 12시에 최저점을 찍는 일일 패턴.
5. 한계점 및 주의사항
- 과적합(Overfitting): 너무 많은 계절성 성분을 추가하면 모델이 노이즈까지 학습하여 예측 성능이 하락한다. 푸리에 차수(Fourier order)를 적절히 조절하여 매끄러운 곡선을 유지해야 한다.
- 주기 불규칙성: 윤년이나 공휴일 등으로 인해 주기가 미세하게 변하는 경우, 고정 주기 모델은 오차가 발생한다. 이를 위해 Prophet과 같은 유연한 모델이나 휴일 효과(Holiday effects) 변수를 추가해야 한다.
- 계산 비용: TBATS와 같은 모델은 데이터의 길이가 길고 주기가 많을수록 메모리 사용량과 연산 시간이 기하급수적으로 증가한다.
6. 관련 개념
- 푸리에 변환 (Fourier Transform): 시간 함수를 주파수 성분으로 분해하는 수학적 변환.
- 주기그램 (Periodogram): 시계열 데이터의 스펙트럼 밀도를 추정하여 지배적인 주기를 찾는 도구.
- STL 분해 (Seasonal-Trend decomposition using Loess): 로에스(Loess) 회귀를 사용하여 추세와 계절성을 분리하는 기법이다. 다만, STL은 기본적으로 단일 주기를 처리하므로, 다중 계절성 데이터에 적용하려면 가장 지배적인 주기를 먼저 제거한 후 반복 적용하는 방식(MSTL, Multiple STL)이 필요하다.
- 상태 공간 모델 (State Space Model): 시스템의 내부 상태를 통해 관측값을 설명하는 모델로, DHR의 기반이 된다.
# 다중 계절성 (Multiple Seasonality)
## 1. 개요
**다중 계절성(Multiple Seasonality)**이란 하나의 시계열 데이터 내에 서로 다른 주기를 가진 두 개 이상의 계절적 패턴이 동시에 존재하는 현상을 의미한다. 이러한 다중 계절성을 정확히 식별하고 모델링하는 것은 복잡한 시계열 데이터에서 노이즈를 제거하고 정확한 수요 예측과 자원 최적화를 달성하기 위해 필수적이다.
일반적인 단일 계절성(Single Seasonality)이 하나의 고정된 주기(예: 매년 1월의 매출 상승)만을 갖는 것과 달리, 다중 계절성은 여러 시간 척도(Time Scale)에서 반복되는 패턴이 중첩되어 나타난다. 대표적인 사례로 전력 수요량 데이터를 들 수 있다. 전력 수요는 하루 단위의 패턴(일간: 낮 시간대 상승, 밤 시간대 하락), 일주일 단위의 패턴(주간: 평일과 주말의 차이), 그리고 1년 단위의 패턴(연간: 여름철 냉방 및 겨울철 난방 수요 증가)이 동시에 작용하여 복합적인 파형을 형성한다.
## 2. 수학적 정의 및 원리
시계열 분해(Time Series Decomposition) 관점에서 다중 계절성은 관측값 $Y_t$를 추세(Trend), 여러 개의 계절성 성분(Seasonal components), 그리고 잔차(Remainder/Error)의 합 또는 곱으로 표현하는 것이다.
### 2.1 가법 모델 (Additive Model)
각 성분이 독립적으로 더해지는 구조이며, 계절성의 진폭이 시간에 따라 일정할 때 사용한다.
$$Y_t = T_t + S_{1,t} + S_{2,t} + \dots + S_{n,t} + \epsilon_t$$
- $T_t$: 추세 성분 (Trend)
- $S_{i,t}$: $i$번째 주기(예: 일간, 주간)의 계절성 성분
- $\epsilon_t$: 불규칙 변동분 (Residual)
### 2.2 승법 모델 (Multiplicative Model)
계절성의 진폭이 추세의 크기에 비례하여 변할 때 사용하며, 각 성분을 곱하는 구조이다.
$$Y_t = T_t \times S_{1,t} \times S_{2,t} \times \dots \times S_{n,t} \times \epsilon_t$$
이 모델에서 각 계절성 성분 $S_{i,t}$는 1을 기준으로 한 비율(Ratio)로 표현된다. 예를 들어, 특정 시점의 계절성 지수가 1.2라면 해당 시점의 값이 추세보다 20% 높음을 의미한다.
### 2.3 단일 계절성 vs 다중 계절성 비교
| 구분 | 단일 계절성 (Single Seasonality) | 다중 계절성 (Multiple Seasonality) |
| :--- | :--- | :--- |
| **주기 수** | 단일 주기 ($s$) | 다수 주기 ($s_1, s_2, \dots, s_n$) |
| **복잡도** | 상대적으로 낮음, 분석 용이 | 높음, 성분 간 간섭 발생 가능 |
| **대표 사례** | 월별 아이스크림 판매량 (연간 주기) | 서버 트래픽 (일간 $\times$ 주간 $\times$ 연간) |
| **분석 도구** | 단순 Seasonal Decomposition, SARIMA | TBATS, Prophet, Dynamic Harmonic Regression |
## 3. 주요 분석 및 모델링 기법
다중 계절성을 처리하기 위해서는 단순한 차분(Differencing)보다는 주기를 유연하게 처리할 수 있는 고급 모델이 필요하다.
### 3.1 핵심 모델 설명
1. **TBATS**: Exponential Smoothing의 확장판으로, **T**(Trigonometric seasonal components), **B**(Box-Cox transformation), **A**(ARMA errors), **T**(Trend), **S**(Seasonal components)의 약자이다. 삼각함수를 이용하여 비정수 주기(Non-integer period)까지 처리할 수 있는 강력한 모델이다.
2. **Prophet**: Meta(Facebook)에서 개발한 모델로, 시계열을 일반화 가법 모델(GAM)로 접근한다. 푸리에 급수(Fourier Series)를 사용하여 다중 계절성을 모델링하며, 휴일 효과나 결측치 처리에 강점이 있다.
- **푸리에 급수 수식**: 특정 주기 $P$를 가진 계절성 성분 $S_t$는 다음과 같이 근사된다.
$$S_t = \sum_{n=1}^{N} \left( a_n \cos\left(\frac{2\pi nt}{P}\right) + b_n \sin\left(\frac{2\pi nt}{P}\right) \right)$$
여기서 $N$은 푸리에 차수(Fourier order)로, 값이 클수록 더 복잡한 패턴을 학습할 수 있다.
3. **Dynamic Harmonic Regression (DHR)**: 상태 공간 모델(State Space Model)의 일종으로, 계절성을 사인(Sine)과 코사인(Cosine) 함수의 조합으로 표현하여 시간에 따라 계절성 패턴이 변하는 경우에도 대응 가능하다.
### 3.2 모델별 장단점 비교
| 모델 | 장점 | 단점 | 적합한 데이터 |
| :--- | :--- | :--- | :--- |
| **TBATS** | 복잡한 다중 주기 자동 탐색 및 처리 가능 | 계산 복잡도가 매우 높고 학습 속도가 느림 | 정밀한 통계적 추정이 필요한 데이터 |
| **Prophet** | 직관적인 파라미터 설정, 빠른 속도, 이상치에 강함 | 통계적 엄밀함이 부족하며 과적합 위험이 있음 | 비즈니스 지표, 도메인 지식이 반영된 데이터 |
| **DHR** | 계절성 변화를 동적으로 추적 가능 | 초기 파라미터 설정 및 모델 설계가 까다로움 | 주기성이 뚜렷하고 변동성이 큰 데이터 |
## 4. 구현 및 적용 방법
### 4.1 주기 탐색을 위한 FFT 분석
모델링 전, 데이터에 어떤 주기가 숨어있는지 확인하기 위해 **고속 푸리에 변환(Fast Fourier Transform, FFT)**을 사용한다. FFT는 시간 영역의 데이터를 주파수 영역으로 변환하여, 어떤 주파수(Frequency)에서 강한 에너지가 나타나는지 분석하는 기법이다.
- **분석 과정**: $\text{Time Domain} \xrightarrow{FFT} \text{Frequency Domain} \rightarrow \text{Peak Detection} \rightarrow \text{Period Calculation}$
- **주기 계산**: $\text{Period} = 1 / \text{Frequency}$
- **시각화 예시**: FFT 결과 그래프(Periodogram)에서 X축은 주파수, Y축은 진폭(Amplitude)으로 나타난다. 특정 주파수 지점에서 뾰족하게 솟은 피크(Peak)가 발견되면, 해당 주파수의 역수가 데이터의 주요 주기임을 의미한다. (예: 주파수 $f=0.1428$에서 피크 발생 $\rightarrow 1/0.1428 \approx 7$일 주기)
### 4.2 단계별 적용 프로세스
1. **데이터 전처리**: 결측치 처리, 이상치 제거 및 로그 변환(승법 모델인 경우)을 수행한다.
2. **주기 탐색**: FFT 또는 Periodogram을 통해 주요 주기($s_1, s_2, \dots$)를 식별한다.
3. **모델링**: 식별된 주기를 기반으로 Prophet의 `add_seasonality` 또는 TBATS 모델을 적용한다.
4. **검증**: AIC/BIC 지표 또는 RMSE, MAPE 등의 오차 지표를 통해 모델 성능을 평가한다.
5. **잔차 분석**: 모델링 후 남은 잔차($\epsilon_t$)에 여전히 주기성이 남아있는지 확인하여, 필요시 추가 주기를 설정하거나 모델을 튜닝한다.
### 4.3 Python 구현 예시 (Prophet 활용)
```python
from prophet import Prophet
import pandas as pd
# 1. 데이터 준비 (ds: 날짜, y: 값)
df = pd.read_csv('power_demand.csv')
# 2. 모델 초기화 및 기본 계절성 설정
model = Prophet(yearly_seasonality=True, weekly_seasonality=True, daily_seasonality=True)
# 3. 사용자 정의 다중 계절성 추가 (예: 4주 주기 - 28일)
model.add_seasonality(name='monthly', period=28, fourier_order=5)
# 4. 모델 학습
model.fit(df)
# 5. 미래 예측
future = model.make_future_dataframe(periods=365)
forecast = model.predict(future)
# 6. 결과 시각화
model.plot_components(forecast)
```
### 4.4 적용 사례 분석 결과 (가상 그래프 묘사)
전력 수요 데이터에 다중 계절성 모델을 적용했을 때, `plot_components` 결과는 다음과 같이 분리되어 나타난다.
- **Trend**: (우상향 곡선) 전반적인 전력 사용량의 점진적 증가 추세.
- **Yearly**: (사인파 형태) 7~8월(여름)과 12~1월(겨울)에 정점을 찍는 연간 반복 패턴.
- **Weekly**: (계단식 패턴) 월~금요일에 높게 유지되다가 토/일요일에 급격히 하락하는 주간 패턴.
- **Daily**: (매일 반복 파형) 오전 9시부터 오후 6시까지 상승했다가 밤 12시에 최저점을 찍는 일일 패턴.
## 5. 한계점 및 주의사항
- **과적합(Overfitting)**: 너무 많은 계절성 성분을 추가하면 모델이 노이즈까지 학습하여 예측 성능이 하락한다. 푸리에 차수(Fourier order)를 적절히 조절하여 매끄러운 곡선을 유지해야 한다.
- **주기 불규칙성**: 윤년이나 공휴일 등으로 인해 주기가 미세하게 변하는 경우, 고정 주기 모델은 오차가 발생한다. 이를 위해 Prophet과 같은 유연한 모델이나 휴일 효과(Holiday effects) 변수를 추가해야 한다.
- **계산 비용**: TBATS와 같은 모델은 데이터의 길이가 길고 주기가 많을수록 메모리 사용량과 연산 시간이 기하급수적으로 증가한다.
## 6. 관련 개념
- **푸리에 변환 (Fourier Transform)**: 시간 함수를 주파수 성분으로 분해하는 수학적 변환.
- **주기그램 (Periodogram)**: 시계열 데이터의 스펙트럼 밀도를 추정하여 지배적인 주기를 찾는 도구.
- **STL 분해 (Seasonal-Trend decomposition using Loess)**: 로에스(Loess) 회귀를 사용하여 추세와 계절성을 분리하는 기법이다. 다만, STL은 기본적으로 단일 주기를 처리하므로, 다중 계절성 데이터에 적용하려면 가장 지배적인 주기를 먼저 제거한 후 반복 적용하는 방식(MSTL, Multiple STL)이 필요하다.
- **상태 공간 모델 (State Space Model)**: 시스템의 내부 상태를 통해 관측값을 설명하는 모델로, DHR의 기반이 된다.